from django.shortcuts import render

from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView
from rest_framework.generics import ListAPIView
from rest_framework.response import Response
# Create your views here.

# 问题！！！
# 因为我们已经告知系统 子应用在apps中 不需要再添加apps
# from apps.users.models import Users

# 正确的
from users.models import Users
from users.utlis import check_verify_token
from .serializers import RegisterCreateUserSerializer, AddressSerializer


# APIView       基类
#GenericAPIView     列表视图和详情视图做了通用支持， 配合mixin 比较容易
#ListAPIView         通用支持,省去了 http 的方法

class RegisterUsernameView(APIView):

    """
    判断用户名是否存在
    1.让前端把用户名传递过来
    2.以get方式把用户名传递过来
    3.实现业务逻辑

    GET         users/usernames/username/

    GET          /users/usernames/(?P<username>\w{5,20})/count/


    GET         /users/usernames/count/?username=xxxx
    """

    def get(self,request,username):

        # count = 0 没有
        # count = 1 注册过
        count = Users.objects.filter(username=username).count()


        #组织数据
        context = {
            'count':count,
            'username':username
        }


        return Response(context)


#如何选取 视图类


class RegisterCreateUserView(APIView):

    """
    1.我们需要让前端把 用户名，密码，确认密码，手机号，短信验证码，是否同意协议 传递过来
    2.后端接收参数，对参数进行校验
    3.数据入库
    4.返回响应

    get
    post        post相对于get而言 安全

    POST        /users/

    """


    def post(self,request):

        # 1. 接收参数
        data = request.data
        # 2. 创建序列化器
        serializer = RegisterCreateUserSerializer(data=data)
        #进行校验
        # raise_exception=True 如果有异常，则抛出异常，后边的代码不执行
        serializer.is_valid(raise_exception=True)

        # 3.数据入库
        serializer.save()

        # Users.objects.create(**validated_data)
        #如果我们的data没有问题，就相当于下边的写发
        # data = {'username':xxx,'password2':xxx}
        # data 多余的字段删除掉
        # Users.objects.create(**data)

        # 4.返回响应
        # serializer.data 做什么？
        #将对象转换为字典       序列化操作
        # user --> 字典中 key
        return Response(serializer.data)

#####################二级视图####################
from rest_framework.mixins import CreateModelMixin
class RegisterCreateUser2View(CreateModelMixin,GenericAPIView):

    serializer_class = RegisterCreateUserSerializer


    def post(self,request):

        return self.create(request)


#####################三级视图####################
from rest_framework.generics import CreateAPIView

class RegisterCreateUser3View(CreateAPIView):

    serializer_class = RegisterCreateUserSerializer


#### 1. 如果我们分析不出来就先继承自APIView
#       实现了功能之后，再对代码进行优化和封装

from rest_framework.permissions import IsAuthenticated
from .serializers import UserInfoSerializer
from rest_framework.mixins import RetrieveModelMixin
# class UserCenterInfoView(APIView):
#     """
#     1.必须是登录用户才可以访问该页面
#     2.获取用户信息， 直接返回就可以
#
#     get  /users/infos/
#
#     """
#     #必须是登录用户才可以访问该页面
#     permission_classes = [IsAuthenticated]
#
#     def get(self,request):
#
#         #我们是采用的jwt token认证
#         #前段把 token传递给我 我就知道谁登录
#         # requst.user 就是 认证登录的用户
#
#         user = request.user
#
#         serializer = UserInfoSerializer(user)
#
#         return Response(serializer.data)


from rest_framework.generics import GenericAPIView
from rest_framework.mixins import RetrieveModelMixin
# class UserCenterInfoView(RetrieveModelMixin,GenericAPIView):
#     """
#     1.必须是登录用户才可以访问该页面
#     2.获取用户信息， 直接返回就可以
#
#     get  /users/infos/
#
#     """
#     #必须是登录用户才可以访问该页面
#     permission_classes = [IsAuthenticated]
#
#     serializer_class = UserInfoSerializer
#
#     # queryset = Users.objects.all()
#
#     def get_object(self):
#
#         return self.request.user
#
#     def get(self,request):
#
#         return self.retrieve(request)

from rest_framework.generics import RetrieveAPIView
class UserCenterInfoView(RetrieveAPIView):
    """
        1.必须是登录用户才可以访问该页面
        2.获取用户信息， 直接返回就可以

        get  /users/infos/

        """
    # 必须是登录用户才可以访问该页面
    permission_classes = [IsAuthenticated]

    serializer_class = UserInfoSerializer

    # queryset = Users.objects.all()

    def get_object(self):
        return self.request.user


from rest_framework.generics import UpdateAPIView
from .serializers import EmailSerializer
from rest_framework.mixins import UpdateModelMixin
# class UserUpdateEmailView(APIView):
#
#     """
#     1.用户在点击设置的时候，输入邮箱，点击保存的时候，前段应该将 邮件信息发送给后台
#     # 2. 后台接受到 邮件信息之后 需要进行校验，
#     # 3.校验完成之后对数据进行 保存操作
#     # 4. 保存之后要发送一封激活邮件
#     # 5. 返回响应
#
#     PUT     /users/emails/
#
#     """
#
#     permission_classes = [IsAuthenticated]
#
#     def put(self,request):
#         # 1. 后台接受到 邮件信息之后 需要进行校验，
#         user = request.user
#
#         data = request.data
#
#         serializer = EmailSerializer(instance=user,data=data)
#
#         serializer.is_valid(raise_exception=True)
#
#         #.2校验完成之后对数据进行 保存操作
#         serializer.save()
#          # 发送激活邮件
#         #3.返回响应
#         return Response(serializer.data)


from rest_framework.generics import UpdateAPIView

class UserUpdateEmailView(UpdateAPIView):

    permission_classes = [IsAuthenticated]
    serializer_class = EmailSerializer

    def get_object(self):

        return self.request.user



from rest_framework import status
class UserEmailActiveView(APIView):
    def get(self,request):
        # 1.获取token
        token = request.query_params.get('token')
        if token is None:
            return Response({'msg':'缺少参数'},status=status.HTTP_400_BAD_REQUEST)
        # 2.对 token 进行处理 {Id : xxx ,email:xxx}
        id = check_verify_token(token)

        if id is None:
            return Response({'msg':'token过期了'},status=status.HTTP_400_BAD_REQUEST)

        # 3.根据id查询用户
        try:
            user = Users.objects.get(id=id)
        except Users.DoesNotExist:
            return Response({'msg':'没有此用户'},status=status.HTTP_400_BAD_REQUEST)

        # 4.修改状态 返回响应
        user.email_active=True
        user.save()

        return Response({'msg':'ok'})




class AddressView(APIView):

    """
    POST        users/addresses/
    """

    permission_classes = [IsAuthenticated]

    def post(self,request):
        """
        1.前端收集用户提交的数据，传递给后端
        2. 接受数据，并对数据进行校验
        3. 数据没有问题就入库
        4. 返回响应

        """

        data = request.data

        serializer = AddressSerializer(data=data,context={'request':request})

        serializer.is_valid(raise_exception=True)

        serializer.save()

        return Response(serializer.data)

